---
keywords: ""
root: "/v5.1"
layout: "default"
title: "sequence"
description: "Swift documentation for 'sequence'"
---

<div class="intro-declaration"><code class="language-swift">func sequence(first:next:)(first: T, next: @escaping (T) -> T?) -> UnfoldFirstSequence&lt;T></code></div><div class="discussion comment"><p>Returns a sequence formed from `first` and repeated lazy applications of
`next`.
</p>
<p>The first element in the sequence is always <code>first</code>, and each successive
element is the result of invoking <code>next</code> with the previous element. The
sequence ends when <code>next</code> returns <code>nil</code>. If <code>next</code> never returns <code>nil</code>, the
sequence is infinite.</p>
<p>This function can be used to replace many cases that were previously handled
using C-style <code>for</code> loops.</p>
<p>Example:</p>
<pre><code class="language-swift">// Walk the elements of a tree from a node up to the root
for node in sequence(first: leaf, next: { $0.parent }) {
  // node is leaf, then leaf.parent, then leaf.parent.parent, etc.
}

// Iterate over all powers of two (ignoring overflow)
for value in sequence(first: 1, next: { $0 * 2 }) {
  // value is 1, then 2, then 4, then 8, etc.
}
</code></pre>
<ul>
<li>Parameter first: The first element to be returned from the sequence.</li>
</ul>
<ul>
<li>Parameter next: A closure that accepts the previous sequence element and
returns the next element.</li>
</ul>
</div><div class="intro-declaration"><code class="language-swift">func sequence(state:next:)(state: State, next: @escaping (inout State) -> T?) -> UnfoldSequence&lt;T, State></code></div><div class="discussion comment"><p>Returns a sequence formed from repeated lazy applications of `next` to a
mutable `state`.
</p>
<p>The elements of the sequence are obtained by invoking <code>next</code> with a mutable
state. The same state is passed to all invocations of <code>next</code>, so subsequent
calls will see any mutations made by previous calls. The sequence ends when
<code>next</code> returns <code>nil</code>. If <code>next</code> never returns <code>nil</code>, the sequence is
infinite.</p>
<p>This function can be used to replace many instances of <code>AnyIterator</code> that
wrap a closure.</p>
<p>Example:</p>
<pre><code class="language-swift">// Interleave two sequences that yield the same element type
sequence(state: (false, seq1.makeIterator(), seq2.makeIterator()), next: { iters in
  iters.0 = !iters.0
  return iters.0 ? iters.1.next() : iters.2.next()
})
</code></pre>
<ul>
<li>Parameter state: The initial state that will be passed to the closure.</li>
</ul>
<ul>
<li>Parameter next: A closure that accepts an <code>inout</code> state and returns the
next element of the sequence.</li>
</ul>
</div>